package com.tianxiabuyi;

import com.tianxiabuyi.utils.JSONUtil;
import com.tianxiabuyi.utils.Tools;

import java.util.HashMap;
import java.util.Map;

/**
 * 接口返回信息<br>
 *
 * @author yangh
 */
public class Message {
    /** 所有已知的错误代码和描述信息 **/
    private static final Map<Integer, String> errMap = new HashMap<Integer, String>();
    /** 接口返回的主要信息 **/
    private Map<String, Object> others = new HashMap<String, Object>();

    static {
        errMap.put(0, "接口调用成功");
        errMap.put(10001, "JSON转Map错误，请检查JSON格式是否正确");
        errMap.put(10002, "JSON解密错误，请检查JSON是否加密");
        errMap.put(20001, "缺少必要的参数(token或hospital)");
        errMap.put(20002, "token已经过期");
        errMap.put(20003, "密码已修改，请重新登录");
        errMap.put(20004, "token未认证");
    }

    /** 返回状态码,0表示成功 **/
    private int errcode;
    /** 返回描述信息 **/
    private String errmsg;

    /**
     * 根据已定义状态码生成消息对象，如果状态码不存在则为未知异常
     */
    public Message(int errcode) {
        this.setErrcode(errcode);
    }

    /**
     * 接口调用成功,返回状态码0,描述信息接口调用成功
     */
    public Message() {
        this(0);
    }

    /**
     * 自定义状态码和状态描述消息对象
     */
    public Message(int errcode, String errmsg) {
        this(errcode);
        this.errmsg = errmsg;
    }

    /**
     * 接口调用成功,状态码为0,描述信息为errmsg
     */
    public Message(String errmsg) {
        this(0, errmsg);
    }

    public int getErrcode() {
        return errcode;
    }

    public void setErrcode(int errcode) {
        String errmsg = Tools.getDesc(errMap.get(errcode), "");
        this.errcode = errcode;
        if ("".equals(errmsg)) {
            this.errmsg = "未知异常";
        } else {
            this.errmsg = errmsg;
        }
    }

    public String getErrmsg() {
        return errmsg;
    }

    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    /**
     * 添加要返回的信息
     */
    public Message put(String key, Object value) {
        this.others.put(key, value);
        return this;
    }

    /**
     * 根据设置的key获取对应的值
     */
    @SuppressWarnings("unchecked")
    public <T> T get(String key) {
        return (T) this.others.get(key);
    }

    /**
     * 为Message对象设置返回码和描述信息
     */
    public Message setErrcodeAndErrmsg(int code, String msg) {
        this.setErrcode(code);
        this.setErrmsg(msg);
        return this;
    }

    /**
     * Message转JSON字符串
     */
    @SuppressWarnings("unchecked")
    public String toJson() {
        Map<String, Object> map = Tools.toMap(this);
        map.remove("errMap");
        Map<String, Object> others = (Map<String, Object>)map.remove("others");
        map.putAll(others);
        return JSONUtil.toJson(map);
    }

    @Override
    public String toString() {
        return this.toJson();
    }
}